﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations.Schema;

namespace Universidad.Negocio.DomainModel
{
    [Table("Alumnos")]
    public class Alumno
    {
        public Alumno()
        {
        }

        public Alumno(int id, string nombre, string email)
        {
            this.Id = id;
            this.Nombre = nombre;
            this.Email = email;
            this.InscripcionesInternas = new List<InscripcionMateria>();
        }

        public int Id { get; set; }

        public string Nombre { get; set; }

        public string Email { get; set; }

        protected virtual internal IList<InscripcionMateria> InscripcionesInternas { get; set; }

        [NotMapped]
        public ICollection<InscripcionMateria> Inscripciones { get { return this.InscripcionesInternas; } }

        public float CalcularPromedioConAplazos()
        {
            List<Nota> todasLasNotas = new List<Nota>();
            foreach (var inscr in this.InscripcionesInternas)
            {
                todasLasNotas.AddRange(inscr.Notas);
            }
            return todasLasNotas.Count > 0
                    ? (float)todasLasNotas.Sum(n => n.ObtenerValorPromediable()) / (float)todasLasNotas.Count
                    : 0;
        }

        public InscripcionMateria Inscribir(Materia materia, DateTime fecha)
        {
            if (materia == null)
                throw new ArgumentNullException("La materia no puede ser null");

            InscripcionMateria inscripcion = new InscripcionMateria(fecha, materia, this);
            this.InscripcionesInternas.Add(inscripcion);
            return inscripcion;
        }


    }
}
